/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufg.inf.si.poo.formula1.ManagementFiles;

import br.ufg.inf.si.poo.formula1.Driver.Driver;
import br.ufg.inf.si.poo.formula1.Library.Library;
import br.ufg.inf.si.poo.formula1.Race.GridPosition;
import br.ufg.inf.si.poo.formula1.Race.GridRace;
import br.ufg.inf.si.poo.formula1.Race.Qualification;
import br.ufg.inf.si.poo.formula1.Race.Race;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * ManagementFilesRace
 *
 * Versao 1.0
 *
 * Data 23/02/2013
 *
 * @author Igor
 */
public class ManagementFilesRace {
    //Construtores
    private ManagementFilesRace() {
        
    }

    
    /**
     * Realiza a leitura da qualificacao da corrida passada no parametro
     * Utilizado em ManagementFilesSeason.readRaceSeason
     * @param season, lee no arquivo de equipe da temporada
     * @param folder, diretorio da pasta da temporada
     */
    public static void readQualificationRace(Race race, String folder) {
        String nome = "Qualificacao.txt";

        //So tera dados se a corrida possuir circuito
        if (race.getCircuit() != null) {
            String folderRace = folder + "/Corridas/" + race.getCircuit().getCountry() + "/";
            //Verifica se o arquivo existe
            File file = new File(folderRace + nome);
            if (file.exists()) {
                try {
                    //Verifica se o arquivo de texto
                    file = new File(folderRace + nome);
                    if (file.exists()) {
                        Qualification qualification = new Qualification();;
                        FileReader arq = new FileReader(folderRace + nome);
                        BufferedReader lerArq = new BufferedReader(arq);

                        /* Faz leitura das primeiras linhas que são as de configuração */
                        String strPosition = lerArq.readLine();
                        String strStartingPosition = lerArq.readLine();
                        String strNumberDriver = lerArq.readLine();
                        String strDriverName = lerArq.readLine();
                        String strQttLapsQualification = lerArq.readLine();
                        String strQttLapsCircuit = lerArq.readLine();
                        String strQ1 = lerArq.readLine();
                        String strQ2 = lerArq.readLine();
                        String strQ3 = lerArq.readLine();
                        String strStatus = lerArq.readLine();
                        String linha = lerArq.readLine();
                        
                        int intPosition = 0;
                        int intStatingPosition = 0;
                        int intNumberDriver = 0;
                        int intQttLapsQualification = 0;
                        int intQttLapsCircuit = 0;
                        long doubleQ1 = 0;
                        long doubleQ2 = 0;
                        long doubleQ3 = 0;

                        while ((strPosition = lerArq.readLine()) != null) {
                            intPosition = Integer.parseInt(strPosition);
                            strStartingPosition = lerArq.readLine(); intStatingPosition = Integer.parseInt(strStartingPosition);
                            strNumberDriver = lerArq.readLine(); intNumberDriver = Integer.parseInt(strNumberDriver);
                            strDriverName = lerArq.readLine(); 
                            strQttLapsQualification = lerArq.readLine(); intQttLapsQualification = Integer.parseInt(strQttLapsQualification);
                            strQttLapsCircuit = lerArq.readLine(); intQttLapsCircuit = Integer.parseInt(strQttLapsCircuit);
                            strQ1 = lerArq.readLine(); doubleQ1 = Long.parseLong(strQ1);
                            strQ2 = lerArq.readLine(); doubleQ2 = Long.parseLong(strQ2);
                            strQ3 = lerArq.readLine(); doubleQ3 = Long.parseLong(strQ3);
                            strStatus = lerArq.readLine();

                            Driver driver = Library.returnDriver(strDriverName);
                            if(driver != null){
                                GridPosition grid = new GridPosition(intNumberDriver, driver, intQttLapsCircuit);

                                grid.setPosition(intPosition);
                                grid.setStartingPosition(intStatingPosition);
                                grid.setQttLapsQualification(intQttLapsQualification);
                                grid.setQttLapsCircuit(intQttLapsCircuit);
                                grid.setQ1(doubleQ1);
                                grid.setQ2(doubleQ2);
                                grid.setQ3(doubleQ3);
                                grid.setStatus(strStatus);
                                qualification.setQualification(grid);
                            }
                        }
                        race.setQualification(qualification);
                        arq.close();
                    }
                } catch (IOException e) {
                    System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
                }
            }
        }
    }
    
    /**
     * Realiza a escrita da qualificacao da corrida passada no parametro
     * @param race, escreve no arquivo da qualificacao da corrida
     * @param folder, diretorio da pasta da temporada
     */
    public static void writeQualificationRace(Race race, String folder) {
        String nome = "Qualificacao.txt";
        Qualification qualification = race.getQualification();
        if(qualification != null){
            String folderRace = folder + "/Corridas/" + race.getCircuit().getCountry() + "/";

            try {
                FileWriter arq = new FileWriter(folderRace + nome);
                PrintWriter escreverArq = new PrintWriter(arq);

                /* Faz escrita das primeiras linhas que são as de configuração */
                escreverArq.println("Position");
                escreverArq.println("Starting Position");
                escreverArq.println("Number Driver");
                escreverArq.println("Driver Name");
                escreverArq.println("qttLapsQualification");
                escreverArq.println("qttLapsCircuit");
                escreverArq.println("Q1");
                escreverArq.println("Q2");
                escreverArq.println("Q3");
                escreverArq.println("Status");
                escreverArq.println("************");

                for (int i = 0; i < qualification.getQttDrivers(); i++) {
                    GridPosition grid = qualification.getQualification()[i];
                    if(grid != null){
                        escreverArq.println(grid.getPosition());
                        escreverArq.println(grid.getStartingPosition());
                        escreverArq.println(grid.getNumberDriver());
                        escreverArq.println(grid.getDriver().getDriverName());
                        escreverArq.println(grid.getQttLapsQualification());
                        escreverArq.println(grid.getQttLapsCircuit());
                        escreverArq.println(grid.getQ1());
                        escreverArq.println(grid.getQ2());
                        escreverArq.println(grid.getQ3());
                        escreverArq.println(grid.getStatus());
                    }
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }
    
    /**
     * Realiza a leitura do gridRace (que eh a corrida executada) da corrida passada no parametro
     * Utilizado em ManagementFilesSeason.readRaceSeason
     * @param season, lee no arquivo de equipe da temporada
     * @param folder, diretorio da pasta da temporada
     */
    public static void readGridRaceRace(Race race, String folder) {
        String nome = "GridRace.txt";

        //So tera dados se a corrida possuir circuito
        if (race.getCircuit() != null) {
            String folderRace = folder + "/Corridas/" + race.getCircuit().getCountry() + "/";
            //Verifica se o arquivo existe
            File file = new File(folderRace + nome);
            if (file.exists()) {
                try {
                    //Verifica se o arquivo de texto
                    file = new File(folderRace + nome);
                    if (file.exists()) {
                        GridRace gridRace = new GridRace();;
                        FileReader arq = new FileReader(folderRace + nome);
                        BufferedReader lerArq = new BufferedReader(arq);

                        /* Faz leitura das primeiras linhas que são as de configuração */
                        String strPosition = lerArq.readLine();
                        String strNumberDriver = lerArq.readLine();
                        String strDriverName = lerArq.readLine();
                        String strQttLapsRace = lerArq.readLine();
                        String strQttLapsCircuit = lerArq.readLine();
                        String strTime = lerArq.readLine();
                        String strStartingPosition = lerArq.readLine();
                        String strPoints = lerArq.readLine();
                        String strStatus = lerArq.readLine();
                        String linha = lerArq.readLine();
                        
                        int intPosition = 0;
                        int intNumberDriver = 0;
                        int intQttLapsRace = 0;
                        int intQttLapsCircuit = 0;
                        long[] longTime;
                        int intPoints = 0;
                        int intStartingPosition = 0;

                        while ((strPosition = lerArq.readLine()) != null) {
                            intPosition = Integer.parseInt(strPosition);
                            strNumberDriver = lerArq.readLine(); intNumberDriver = Integer.parseInt(strNumberDriver);
                            strDriverName = lerArq.readLine(); 
                            strQttLapsRace = lerArq.readLine(); intQttLapsRace = Integer.parseInt(strQttLapsRace);
                            strQttLapsCircuit = lerArq.readLine(); intQttLapsCircuit = Integer.parseInt(strQttLapsCircuit);
                            longTime = new long[intQttLapsCircuit];
                            for(int i = 0;i < intQttLapsCircuit;i++){
                                strTime = lerArq.readLine();
                                longTime[i] = Long.parseLong(strTime);
                            }
                            strStartingPosition = lerArq.readLine(); intStartingPosition = Integer.parseInt(strStartingPosition);
                            strPoints = lerArq.readLine(); intPoints = Integer.parseInt(strPoints);
                            strStatus = lerArq.readLine();

                            Driver driver = Library.returnDriver(strDriverName);
                            if(driver != null){
                                GridPosition grid = new GridPosition(intNumberDriver, driver, intQttLapsCircuit);

                                grid.setPosition(intPosition);
                                grid.setQttLapsRace(intQttLapsRace);
                                grid.setTimeLap(longTime);
                                grid.setPoints(intPoints);
                                grid.setStatus(strStatus);
                                gridRace.setGridRace(grid);
                                grid.setStartingPosition(intStartingPosition);
                            }
                        }
                        race.setGridRace(gridRace);
                        arq.close();
                    }
                } catch (IOException e) {
                    System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
                }
            }
        }
    }

    /**
     * Realiza a escrita do gridRace (que eh a corrida executada) da corrida passada no parametro
     * @param race, escreve no arquivo da gridRace da corrida
     * @param folder, diretorio da pasta da temporada
     */
    public static void writeGridRaceRce(Race race, String folder) {
        String nome = "GridRace.txt";
        GridRace gridRace = race.getGridRace();
        if(gridRace != null){
            String folderRace = folder + "/Corridas/" + race.getCircuit().getCountry() + "/";

            try {
                FileWriter arq = new FileWriter(folderRace + nome);
                PrintWriter escreverArq = new PrintWriter(arq);

                /* Faz escrita das primeiras linhas que são as de configuração */
                escreverArq.println("Position");
                escreverArq.println("Number Driver");
                escreverArq.println("Driver Name");
                escreverArq.println("qttLapsRace");
                escreverArq.println("qttLapsCircuit");
                escreverArq.println("Times x"+race.getCircuit().getNumberLaps());
                escreverArq.println("Starting Position");
                escreverArq.println("Points");
                escreverArq.println("Status");
                escreverArq.println("************");

                for (int i = 0; i < gridRace.getQttDrivers(); i++) {
                    GridPosition grid = gridRace.getGridRace()[i];
                    if(grid != null){
                        escreverArq.println(grid.getPosition());
                        escreverArq.println(grid.getNumberDriver());
                        escreverArq.println(grid.getDriver().getDriverName());
                        escreverArq.println(grid.getQttLapsRace());
                        escreverArq.println(grid.getQttLapsCircuit());

                        for(int j = 0;j < grid.getQttLapsCircuit();j++){
                            escreverArq.println(grid.getTimeLap()[j]);
                        }

                        escreverArq.println(grid.getStartingPosition());
                        escreverArq.println(grid.getPoints());
                        escreverArq.println(grid.getStatus());
                    }
                }

                arq.close();
            } catch (IOException e) {
                System.err.printf("Erro na abertura do arquivo: %s\nArquivo: %s\n", e.getMessage(), nome);
            }
        }
    }
}
